home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / src / X11R4 / cmds / X / ddx / dec / qdss / libtl / tldchange.c < prev    next >
Encoding:
C/C++ Source or Header  |  1989-11-26  |  5.2 KB  |  177 lines

  1. /***********************************************************
  2. Copyright 1987, 1988 by Digital Equipment Corporation, Maynard, Massachusetts,
  3. and the Massachusetts Institute of Technology, Cambridge, Massachusetts.
  4.  
  5.                         All Rights Reserved
  6.  
  7. Permission to use, copy, modify, and distribute this software and its 
  8. documentation for any purpose and without fee is hereby granted, 
  9. provided that the above copyright notice appear in all copies and that
  10. both that copyright notice and this permission notice appear in 
  11. supporting documentation, and that the names of Digital or MIT not be
  12. used in advertising or publicity pertaining to distribution of the
  13. software without specific, written prior permission.  
  14.  
  15. DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
  16. ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
  17. DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
  18. ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
  19. WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
  20. ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
  21. SOFTWARE.
  22.  
  23. ******************************************************************/
  24.  
  25. #include    <sys/types.h>
  26. #include    "Ultrix2.0inc.h"
  27. #include    "miscstruct.h"
  28. #include    "tldstate.h"
  29. #include    "tltemplabels.h"
  30.  
  31. #include    "qd.h"
  32. #include    <vaxuba/qduser.h>
  33. #include    <vaxuba/qdreg.h>
  34. #include    "tl.h"
  35. #include "X.h"
  36. #include "gcstruct.h"
  37. #include "qdgc.h"
  38.  
  39. #define SETALU(planes, alu) \
  40. { int _planes_ = planes;\
  41.   if (_planes_) {\
  42.     *p++ = JMPT_SETPLANEMASK;\
  43.     *p++ = _planes_;\
  44.     *p++ = JMPT_SETALU;\
  45.     *p++ = alu;\
  46. }}
  47.  
  48. /* Used for CopyPlane and similar operations.
  49.  * Compensates for protocol/GPX mismatch:
  50.  * The Protocol requires the source to be expanded *before* being passed
  51.  * to the ALU, while the GPX FG/BG MUX is *after* the ALU.
  52.  * The trick is to ignore the MUX (let FG=ones and GB=zeros),
  53.  * but set the ALU function to a different value for each plane,
  54.  * depending on a combination of the alu with the fgPixel and bgPixel
  55.  * for that plane.
  56.  */
  57. SetPlaneAlu(pGC)
  58.      GCPtr    pGC;
  59. {
  60.     /* For planes where fgPixel==bgPixel, the result is independent of
  61.      * the source, so the effective ALU reduces to one of the following. */
  62.     static char map_alu[4] = {
  63.     LF_ZEROS|FULL_SRC_RESOLUTION,    /* D = 0 */
  64.     0xC|FULL_SRC_RESOLUTION,    /* D = D -- i.e. no-op */
  65.     0x3|FULL_SRC_RESOLUTION,    /* D = NOT D */
  66.     LF_ONES|FULL_SRC_RESOLUTION, };    /* D = 1 */
  67.  
  68.     register unsigned short     *p;
  69.     int planemask = pGC->planemask & Allplanes;
  70.     int fgPixel = pGC->fgPixel;
  71.     int bgPixel = pGC->bgPixel;
  72.     Need_dma(6 * NMASKSHORTS + 5*3 + 1);
  73.     SETALU(Allplanes & ~planemask, 0xC|FULL_SRC_RESOLUTION); /* no-op */
  74.     SETALU( fgPixel & ~bgPixel & planemask, umtable[pGC->alu]);
  75.     SETALU(~fgPixel &  bgPixel & planemask, umtable[pGC->alu] & ~0x0040);
  76.     SETALU(~fgPixel & ~bgPixel & planemask, map_alu[pGC->alu >> 2]);
  77.     SETALU( fgPixel &  bgPixel & planemask, map_alu[pGC->alu & 3]);
  78.     *p++ = JMPT_SETPLANEMASK;
  79.     *p++ = Allplanes;
  80.     Confirm_dma();
  81. }
  82.  
  83. #define TILE_X 0
  84. #define TILE_Y ScreenHeight
  85.  
  86. InstallState(pGC, pDraw)
  87.     GCPtr pGC;
  88.      DrawablePtr pDraw;
  89. {
  90.     register unsigned short     *p;
  91.  
  92.  /*
  93.   * Uses the following pGC fields:
  94.   * - fillStyle
  95.   * - Depending on fillStyle:
  96.   * - fgPixel, bgPixel, tile or stipple, patOrg
  97.   * to set (depending on fillStyle):
  98.   * - SOURCE
  99.   * - SRC2_OCRB
  100.   * - SOURCE2_X, SOURCE2_Y, SOURCE2_MAGIC
  101.   */
  102.  
  103.     DDXPointRec        tileOrg;    /* off-screen rotated tile address */
  104.     int            magic;
  105.     int        mask;    /* planes used by offscreen dragon tile */
  106.     int fore, back;
  107.  
  108.     switch(pGC->fillStyle) {
  109.       case FillSolid:
  110.     Need_dma(4+NCOLORSHORTS);
  111. #if 0
  112.     *p++ = MAC_SETCOLOR;
  113.     SETCOLOR(p, fore);
  114. #endif
  115.     *p++ = JMPT_SETSRC2OCRB;
  116.     *p++ = 0;
  117.     Confirm_dma();
  118.     break;
  119.       case FillTiled:
  120.     tlrotile(pGC->tile, pGC->patOrg, &magic);
  121.     Need_dma(6);
  122.     *p++ = JMPT_SETSRC2OCRB;
  123.     *p++ = EXT_NONE|INT_SOURCE|NO_ID|BAR_SHIFT_DELAY;
  124.         *p++ = JMPT_INIT2TILE;
  125.     *p++ = TILE_X;
  126.     *p++ = TILE_Y;
  127.     *p++ = magic;
  128.     Confirm_dma();
  129.     break;
  130.       case FillStippled:
  131.     tlrotile(pGC->stipple, pGC->patOrg, &magic);
  132.     Need_dma(7+NCOLORSHORTS);
  133. #if 0
  134.     *p++ = MAC_SETCOLOR;
  135.     SETCOLOR(p, fore);
  136. #endif
  137.     *p++ = JMPT_SETSRC2OCRB;
  138.     *p++ = EXT_NONE|12|NO_ID|BAR_SHIFT_DELAY; /* 12 == INT_M2 */
  139.         *p++ = JMPT_INIT2TILE;
  140.     *p++ = TILE_X;
  141.     *p++ = TILE_Y;
  142.     *p++ = magic;
  143.     Confirm_dma();
  144.     break;
  145.       case FillOpaqueStippled:
  146.     /* Confirm stipple in advance (instead of letting tlrotile
  147.      * do it) since Confirm assumes default values in fg/bg registers. */
  148.     if (!tlConfirmPixmap(pGC->stipple))
  149.         FatalError("InstallState: cannot Confirm stipple");
  150.     Need_dma(1+2*NCOLORSHORTS);
  151.     *p++ = MAC_SETFOREBACKCOLOR;
  152.     if (pDraw && pDraw->depth == 1) {
  153.         fore = pGC->fgPixel ? Allplanes : 0;
  154.         back = pGC->bgPixel ? Allplanes : 0;
  155.     }
  156.     else {
  157.         fore = pGC->fgPixel;
  158.         back = pGC->bgPixel;
  159.     }
  160.     SETCOLOR(p, fore);
  161.     SETCOLOR(p, back);
  162.     Confirm_dma();
  163.     tlrotile(pGC->stipple, pGC->patOrg, &magic);
  164.     Need_dma(7);
  165.     *p++ = JMPT_SETSRC2OCRB;
  166.     *p++ = EXT_NONE|INT_SOURCE|NO_ID|BAR_SHIFT_DELAY;
  167.         *p++ = JMPT_INIT2TILE;
  168.     *p++ = TILE_X;
  169.     *p++ = TILE_Y;
  170.     *p++ = magic;
  171.     *p++ = JMPT_RESET_FORE_BACK;
  172.     Confirm_dma();
  173.     break;
  174.     }
  175.     InstalledGC = pGC;
  176. }
  177.